
/**
 * 
 * 靠谱的车
 * 题目描述

程序员小明打了一辆出租车去上班。出于职业敏感，他注意到这辆出租车的计费表有点问题，总是偏大。

出租车司机解释说他不喜欢数字4，所以改装了计费表，任何数字位置遇到数字4就直接跳过，其余功能都正常。

比如：

23再多一块钱就变为25；
39再多一块钱变为50；
399再多一块钱变为500；
小明识破了司机的伎俩，准备利用自己的学识打败司机的阴谋。

给出计费表的表面读数，返回实际产生的费用。
 * 
 */

 /**
  * 输入描述
只有一行，数字N，表示里程表的读数。

(1<=N<=888888888)。

输出描述
一个数字，表示实际产生的费用。以回车结束。
  */

  /**
   * 
   * 用例
   * 
   * 输入	5
输出	4
说明	
5表示计费表的表面读数。
4表示实际产生的费用其实只有4块钱。

输入	17
输出	15
说明	
17表示计费表的表面读数。
15表示实际产生的费用其实只有15块钱。

输入	100
输出	81
说明	
100表示计费表的表面读数。
81表示实际产生的费用其实只有81块钱。
   * 
   */

import java.util.Arrays;
import java.util.Scanner;

/**
 * 
 * 题目解析
 * 
 * 遇到 4 跳过，相当于 9 进制，
 * 
 * 计费表费用是13的话，那么对应的真实费用是 1 * 9^1 + 3 * 9^0 = 12
 * 计费表费用是15的话，那么对应真实费用就是 1 * 9^1 + (5-1) * 9^0 = 13
 * 
 * 10个数字 跳过i 个 就是 10-i 进制
 * 
 * 将数字拆分成单个  计算方法
 * 个位  小于 4 k*9^0  大于 4 (k-1)*9^0 
 * 十位  小于 4 k*9^1  大于 4 (k-1)*9^1
 * 
 * Arrays.stream(showAmount.split("")).mapToInt(Integer::parseInt).toArray()
 * 将金额按位拆分成数组
 *  Math.pow(9, showAmounts.length - 1 -i)  指数运算   9 进制 个位*9^0 十位*9^1
 * 
 */

public class 靠谱的车 {

    public static void main(String[] args){

        try{

            //真实金额
            int realAmount = 0;

            //接收输入
            Scanner scanner = new Scanner(System.in);

            //打表金额
            String showAmount = scanner.nextLine();

            //将打表金额拆封城数组
            int[] showAmounts = Arrays.stream(showAmount.split("")).mapToInt(Integer::parseInt).toArray();

            //计算
            for(int i=0; i<showAmounts.length; i++){

                int target = showAmounts[i];
                if(target > 4) target -= 1;

                target *= Math.pow(9, showAmounts.length - 1 -i);

                realAmount += target;
            }

            System.out.println(realAmount);


        }catch(Exception e){
            e.printStackTrace();
            System.out.println("程序异常"+(null==e?"":e.getMessage()));
        }

    }
}
